通过加减乘除位运算了解 Rust
测试代码如下图,都是一些基本的代码。
终端输入 "cargo build" 开始分析吧,将编译处理的 bin 拖入到 Ida 中。(bin 反编译结果放在结尾)
问题一:未反编译出的代码
无论我如何反编译,都无法显示 00000001400012D9 至 00000001400012F1 的基本块代码内容。
请教了 “XDbg” 老大后,了解到 Ida 会对反编译结果进行优化,上图基本块是绝对不会执行到的。嗯,Ida 真是聪明,连代码是否会执行都知道。
问题二:异常检测代码
我把代码都翻了翻,发现“加、减、乘、除”的代码都是有安全检测的。例如,加法指令会检测 “被操作数值 + 1” 是否溢出,如果溢出,便会触发 panic(Rust的异常处理机制),打印出 “异常类型、异常代码所处源文件名、对应的异常代码行”。
不过,Rust 对于位运算指令是没有安全检测的。
问题三:Relase 版本会显示源码相关信息
我通过 "cargo build --release" 编译出来的程序在触发异常后,仍然会输出相关的异常信息,而且我并没有在 .toml 配置文件中找到有相关属性可以消除这些符号。设想一下,如果我正在编写 “anti_cracker.rs”(防破解)模块,被对手想方设法地触发了一个异常,泄露了对应的代码行,加之 Rust 编译出的模块代码在内存布局中 “方差” 较小的特性。可能被一个十分简单的脚本暴力收集我编写了多时的防破解功能的信息。
为了解决这个问题,我想着直接抹掉其相关信息。经过调试,观察内存布局,发现 “core::panicking::panic::h61d0277f5e1a7407” 的参数 1 为 “异常类型”,参数 3 为 “源码名:异常代码行”。编写个脚本即可全部抹掉。
本篇内容到此便结束了,记录下我学习 Rust 加减乘除及位运算指令的过程。